<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>
    第八课.
    正则表达式.
    Math类型.
    Date对象
  </title>
</head>
<body>

正则表达式
特殊的量词：
?: 可有可无，最多一次
*: 可有可无，不限制次数
+: 至少出现一次
如果正文中出现要用转译
@example 手机号 ^(\+86)?\s*1[3-8]\d{9}$
@example 邮箱 ^\w+@\w+([-]\w+)*(\.\w+)+$
@example 找张图片 (\w+\/)*\w+\.(jpg|png)

(): 分组：改变模式的匹配顺序
| 或者

^:在正则表达式的开头表示以X开始
$:在正则表达式的结尾，以什么结束

?=:预判，在前一个字符之后，必须紧跟XXX
?!:预判，在前一个字符之后，不能跟XXX

RegExp对象：专门封装一条正则表达式，并提供使用正则的常用API

找到是否符合 查找 返回boolean
regExp.test(μ) 验证要加^$

查找关键字的位置，也能找到关键字的内容
regExp.exec('匹配的内容')
arr[0]:找到的关键字的内容
arr.index属性：找到关键字的位置

查找有没有或者位置 var num = str.indexOf() 需要正则用 search()
仅找到关键字的内容 var arrs = str.match(reg)
及找位置又找内容 regExp.exec(str)
截断并返回数组 str.split(reg);

动态的创建正则表达式 var reg = new RegExp('\\d{6}','ig'); 斜线都加双斜线

从正则表达式中提取子分组 RegExp.$n 第n个括号从1开始 必须用RegExp类型直接调用.$n

<!-- ------------------- -->
str.trim(); 去除字符串开始和结尾的空格 （！！！ IE9 以上）
<!-- ------------------- -->

Math类型：封装了所有数学计算的API

Math.round(num) --> 四舍五入取整
Math.ceil(num) --> 向上取整
Math.floor(num) --> 向下取整

Math.pow(底数，幂) --> 求指
Math.sqrt(平方根) // 开平方

Math.abs(num) 绝对值
Math.max(num1,num2) 最大值
Math.min(num1,num2) 最小值

Math.random() 随机数 含头不含尾
// @example Math.floor(Math.random()*(max-min+1)+min);

<!-- --------------------------- -->

Date 对象： 封装一个时间点数据，提供对时间日期的常用API
创建： var date = new Date();
自定义时间： var date = new Date('2015/6/9 16:47')

* Date对象中,保存的是从1970年1月1日 0:00:00 到现在的毫秒数
@example 获取年份，避免千年虫问题： new Date().getFullYear()

API:
1.每一个分量都有一对儿get,set方法，获取/设置该分量的值
2.命名：年月日 没有s; 时分秒 有s
3.取值/赋值：除了每月中的日之外，其余都是从0开始，到-1结束

new Date().getMonth()+1 --> 月份， 取值加1，赋值-1
new Date().getDate() 日期
new Date().getDay() 星期： // 日 一 .... 六
// 0 1 ... 6
日期计算：@example
时间相减，得到毫秒数
时间+： var nowMs = Date.getTime() 返回时间毫秒
var nexMs = nowMs+5*60*1000;
var next = new Date(nextMs);
使用毫秒做计算，不改变原时间对象，需要重新封装时间对象

3.任意分量的计算 ，先取出分量值，做计算，再set 回去
setXXX():1.自动调整进制

<!-- --------- -->
日期格式转换
Date.toLocaleString(); --> 获取本地格式
Date.toLocaleDateString(); --> 获取本地日期部分的格式
Date.toLocaleTimeString(); --> 获取时间部分的格式
要自定义format(date)方法~
<!-- --------- -->

<script>
  var str = '  no zuo no die   ';

  // @example .* .+贪婪匹配 .+? .*?表示懒惰匹配(向后扩展)
  var reg = /<a(.+?)href=".*?"(.*?)>/ig; // 匹配一个超链接

  // 去除开头和结尾的空格
  var regExp = /(^\s+)|(\s+$)/g;
  str.replace(regExp, '');

  /* 用Math.max 求数组最大值 */
  var arr = [1, 8, 2, 3, 6];
  var max = Math.max.apply(Math, arr);

  // 随机生成4位验证码
  // Step1: 将所有字母和数字装入数组备用
  var codes = [];
  // 数字：48-57
  for (var i = 48; i <= 57; codes.push(i), i++);
  // 大写字母 65-90
  for (var i = 65; i <= 90; codes.push(i), i++);
  // 小写字母 97-122
  for (var i = 97; i <= 122; codes.push(i), i++);

  var carr = [];
  for (var i = 0; i < 4; i++) {
    var index = Math.floor(Math.random() * (61 - 0 + 1) + 0);
    var char = String.fromCharCode(codes[index]);
    arr.push(char);
  }
  console.log('验证码' + carr.join(''));

  // @example 设置一个日期算法
  var now = new Date('1991/1/26');
  var next = new Date(now.getTime());
  var deg = next.getDate();
  deg -= 15;
  next.setDate(deg);
  console.log(next);

  // @example 算一个到期的时间
  var hire = new Date('2012/6/29');
  hire.setFullYear(hire.getFullYear() + 3);

  // @example 序列化一个时间
  function format(date) {
    var week = ['日', '一', '二', '三', '四', '五', '六'];
    var y = date.getFullYear() + '年'; // 年
    var m = date.getMonth() + 1 + '月'; // 月
    var d = date.getDate() + '日'; // 日

    var w = ' 星期' + week[date.getDay()]; // 星期
    // 时间
    var h = date.getHours(); // 小时
    var am = h <= 12 ? ' 上午' : ' 下午'; // am：pm
    h = h > 12 ? '0' + h - 12 : '' + h; // 12小时制
    var min = date.getMinutes(); // 分钟
    min = min < 10 ? '0' + min : '' + min;
    var s = date.getSeconds(); // 秒
    s = s < 10 ? '0' + s : '' + s;

    return y + m + d + w + ' ' + am + ' ' + h + ':' + min + ':' + s;
  }
  format(new Date());

</script>
</body>
</html>